 /**
 ******************************************************************************
 *
 * 硬件资源及引脚分配：
 * 1,   UART0 --> ESP32S3 IO
 *       TXD0 --> IO43
 *       RXD0 --> IO44
 * 2,  XL9555 --> ESP32S3 IO
 *        SCL --> IO42
 *        SDA --> IO41
 *        INT --> IO0(跳线帽连接) 
 * 3, SPI_LCD --> ESP32S3 IO / XL9555
 *         CS --> IO21
 *        SCK --> IO12
 *        SDA --> IO11
 *         DC --> IO40(跳线帽连接)
 *        PWR --> XL9555_P13
 *        RST --> XL9555_P12
 *
 * 实验现象：
 * 1, 跳线帽连接LCD_DC和IO_SEL后，下载程序成功后，LCD会显示实验信息并开始刷屏以及显示Logo和一个旋转的立方体
 * 
 * 注意事项：
 * 无
 ******************************************************************************
 */

#include "uart.h"
#include "xl9555.h"
#include "spilcd.h"
#include "menu.h"

menu_t main_menu;
/**
 * @brief    当程序开始执行时，将调用setup()函数，通常用来初始化变量、函数等
 * @param    无
 * @retval   无
 */
void setup() 
{
    uart_init(0, 115200);   /* 串口0初始化 */
    xl9555_init();          /* IO扩展芯片初始化 */
    lcd_init();             /* LCD初始化 */

    xl9555_io_config(KEY0 | KEY1 | KEY2 | KEY3, IO_SET_INPUT);  /* 初始化IO扩展芯片用作按键的引脚为输入状态 */

    menu_init();    // 初始化菜单
    menu_draw(&main_menu);  // 初始绘制菜单

    delay(500);
}

/**
 * @brief    循环函数，通常放程序的主体或者需要不断刷新的语句
 * @param    无
 * @retval   无
 */
void loop() 
{
    if (!IIC_INT) {  // 检测到按键中断（低电平有效）
      if (IIC_INT == 0) {
        // delay(20);   // 消抖
        if (xl9555_get_pin(KEY0) == 0) {  // 确认键
            Serial.printf("KEY0 is pressed\n");
            handle_menu_key(KEY_BACK);
        }
        else if (xl9555_get_pin(KEY1) == 0) {  // 上键
            Serial.printf("KEY1 is pressed\n");
            handle_menu_key(KEY_DOWN);
        }
        else if (xl9555_get_pin(KEY2) == 0) {  // 下键
            Serial.printf("KEY2 is pressed\n");
            handle_menu_key(KEY_ENTER);
        }
        else if (xl9555_get_pin(KEY3) == 0) {  // 返回键
            Serial.printf("KEY3 is pressed\n");
            handle_menu_key(KEY_UP);
        }
      }
    }
    delay(10);
}
